// http/index.js
const app = getApp(); // token 存在全局 `app` 下
const HOST = 'http://localhost:7777'; // 接口域名
/**
 * @desc 接口请求封装 
 * @param {string} url 接口地址（不包含域名）
 * @param {object} [data] 请求参数
 * @param {string} [method="GET"] 请求方法，目前支持 get、post、put、delete 四种
 * @param {object} [header] 请求头信息，默认为 Authorization
 * @return {promise} 请求结果 promise
 */
function request(url, data = {}, method = 'GET', header = {}) {
  // 校验是否存在 token，不存在则不传入
  if (app.token) {
    header = Object.assign(header, {
      // 注意 Bearer 后有一个空格
      Authorization: `Bearer ${app.token}`
    })
  }

  // 返回一个 Pormise ，使其支持 Promise 调用
  return new Promise((resolve, reject) => {
    wx.request({
      url: HOST + url,
      data,
      method,
      header,
      success: ({
        statusCode,
        data
      }) => {
        // 用户未登录或者 token 过期，则返回登录页
        if (statusCode === 401) {
          setTimeout(() => {
            wx.navigateTo({
              url: "/pages/account/login/index"
            })
          }, 0)
        }

        // 请求成功
        if (statusCode === 200) {
          // 业务状态码大于400，则为异常，并显示对应异常提示信息
          if (data.code >= 400) {
            wx.showToast({
              title: String(data.message || 'system error'),
              icon: 'none',
              duration: 2000
            })
          }
          // 返回该异常值
          resolve(data)
        }

        // 其它 http 级异常，返回异常值
        resolve({
          code: statusCode,
          message: data.message,
          data: {}
        })
      },
      fail: err => {
        // 失败时返回错误信息，这样使用端不需要 try catch 接收
        reject({
          code: err.errno || 400,
          message: err.errMsg,
          data: {}
        })

        // 异常提示
        wx.showToast({
          title: err.errMsg,
          icon: 'error',
          duration: 2000
        })
      }
    })
  })
}


// http/index.js
/**
 * @desc 文件上传请求封装 
 * @param {string} url 上传接口地址（不包含域名）
 * @param {string} filePath 要上传文件资源的路径 (本地路径)
 * @param {string} name 文件名称值 key
 * @param {object} [formData] HTTP 请求中其他额外的 form data
 * @param {number} [timeout=60000] 超时时间，单位为毫秒
 * @return {promise} 上传结果 promise
 */
function upload(url, filePath, name = 'file', formData = {}, timeout = 60000) {
  // 返回一个 Pormise ，使其支持 Promise 调用
  return new Promise((resolve, reject) => {
    wx.uploadFile({
      url: HOST + url,
      filePath,
      name,
      formData,
      header: {
        // 上传接口必传 token ，后端会校验该值是否合法
        // 注意 Bearer 后有一个空格
        Authorization: `Bearer ${app.token}`
      },
      timeout,
      success: ({
        data
      }) => {
        if (typeof data === 'string') {
          data = JSON.parse(data)
        }
        resolve(data)
      },
      fail: err => {
        // 失败时返回错误信息，这样使用端不需要 try catch 接收
        reject({
          code: err.errno || 400,
          message: err.errMsg,
          data: {}
        })

        // 异常提示
        wx.showToast({
          title: err.errMsg,
          icon: 'error',
          duration: 2000
        })
      }
    })
  })
}

// http/index.js
export default {
  // get 请求
  get(url, data, header = {}) {
    return request(url, data, 'GET', header)
  },
  // post 请求
  post(url, data, header = {}) {
    return request(url, data, 'POST', header)
  },

  // put 请求
  put(url, data, header = {}) {
    return request(url, data, 'PUT', header)
  },

  // 删除请求
  delete(url, data, header = {}) {
    return request(url, data, 'DELETE', header)
  },

  // 上传请求
  upload(url, filePath, name, formData) {
    return upload(url, filePath, name, formData)
  }
}